উদাহরণ সহ ResultSetExtractor এর ব্যবহার

Java Technologies - স্প্রিং জেডিবিসি (Spring JDBC) Spring JDBC এবং ResultSetExtractor |
62
62

Spring JDBC-তে ResultSetExtractor একটি ইন্টারফেস, যা জটিল ডাটাবেস অপারেশনের জন্য ব্যবহার করা হয়। এটি ডাটাবেস থেকে রিট্রাইভ করা ResultSet এর উপর কাস্টম প্রক্রিয়াকরণ করার জন্য একটি সুবিধাজনক পদ্ধতি সরবরাহ করে।


ResultSetExtractor কী?

  • ResultSetExtractor একটি ফাংশনাল ইন্টারফেস যা শুধুমাত্র একটি মেথড সরবরাহ করে:

    T extractData(ResultSet rs) throws SQLException, DataAccessException;
    
  • এটি একটি সম্পূর্ণ ResultSet নেয় এবং এটি প্রক্রিয়াকরণ করে একটি অবজেক্ট রিটার্ন করে।
  • এটি যখন ডাটাবেসের একাধিক রেকর্ড নিয়ে কাজ করতে হয় এবং ডাটা ম্যানিপুলেশন প্রয়োজন, তখন ব্যবহৃত হয়।

ResultSetExtractor ব্যবহার করার সুবিধা

  1. কাস্টম ডাটা প্রসেসিং: একাধিক রেকর্ড বা জটিল ডাটা প্রসেসিংয়ের জন্য আদর্শ।
  2. লুজলি-কাপল্ড ডিজাইন: Spring এর JdbcTemplate API এর সাথে সহজেই ইন্টিগ্রেটেড।
  3. জটিল লজিক ইমপ্লিমেন্ট করা সহজ: যখন RowMapper যথেষ্ট নয়, তখন ResultSetExtractor ব্যবহৃত হয়।

ResultSetExtractor এর ব্যবহার উদাহরণ

উদাহরণ ১: সিম্পল কাস্টম ডাটা প্রসেসিং

ধরা যাক আমাদের একটি employees টেবিল রয়েছে:

CREATE TABLE employees (
    id INT PRIMARY KEY,
    name VARCHAR(100),
    department VARCHAR(50),
    salary DECIMAL(10, 2)
);

আমরা ResultSetExtractor ব্যবহার করে একটি তালিকা তৈরি করব যেখানে প্রত্যেক ডিপার্টমেন্টের অধীনে কাজ করা সকল কর্মচারী থাকবে।

কোড:

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.jdbc.core.ResultSetExtractor;
import org.springframework.stereotype.Service;

import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

@Service
public class EmployeeService {

    @Autowired
    private JdbcTemplate jdbcTemplate;

    public Map<String, List<String>> getEmployeesByDepartment() {
        String sql = "SELECT name, department FROM employees";

        return jdbcTemplate.query(sql, new ResultSetExtractor<Map<String, List<String>>>() {
            @Override
            public Map<String, List<String>> extractData(ResultSet rs) throws SQLException {
                Map<String, List<String>> departmentMap = new HashMap<>();

                while (rs.next()) {
                    String department = rs.getString("department");
                    String name = rs.getString("name");

                    departmentMap.putIfAbsent(department, new ArrayList<>());
                    departmentMap.get(department).add(name);
                }

                return departmentMap;
            }
        });
    }
}

ফলাফল:
যদি টেবিলের ডাটা এই রকম হয়:

INSERT INTO employees (id, name, department, salary) VALUES (1, 'John Doe', 'HR', 50000);
INSERT INTO employees (id, name, department, salary) VALUES (2, 'Jane Smith', 'IT', 60000);
INSERT INTO employees (id, name, department, salary) VALUES (3, 'Bob Johnson', 'HR', 45000);

তাহলে মেথডটি রিটার্ন করবে:

{
    "HR": ["John Doe", "Bob Johnson"],
    "IT": ["Jane Smith"]
}

উদাহরণ ২: জটিল ডাটা প্রসেসিং

ধরা যাক, আপনি প্রতিটি ডিপার্টমেন্টের জন্য টোটাল সেলারি এবং কর্মচারীদের সংখ্যা খুঁজছেন।

কোড:

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.jdbc.core.ResultSetExtractor;
import org.springframework.stereotype.Service;

import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.HashMap;
import java.util.Map;

@Service
public class DepartmentStatsService {

    @Autowired
    private JdbcTemplate jdbcTemplate;

    public Map<String, Map<String, Object>> getDepartmentStats() {
        String sql = "SELECT department, COUNT(*) AS employee_count, SUM(salary) AS total_salary FROM employees GROUP BY department";

        return jdbcTemplate.query(sql, new ResultSetExtractor<Map<String, Map<String, Object>>>() {
            @Override
            public Map<String, Map<String, Object>> extractData(ResultSet rs) throws SQLException {
                Map<String, Map<String, Object>> statsMap = new HashMap<>();

                while (rs.next()) {
                    String department = rs.getString("department");
                    int employeeCount = rs.getInt("employee_count");
                    double totalSalary = rs.getDouble("total_salary");

                    Map<String, Object> stats = new HashMap<>();
                    stats.put("employee_count", employeeCount);
                    stats.put("total_salary", totalSalary);

                    statsMap.put(department, stats);
                }

                return statsMap;
            }
        });
    }
}

ফলাফল:
যদি টেবিলের ডাটা এই রকম হয়:

INSERT INTO employees (id, name, department, salary) VALUES (1, 'John Doe', 'HR', 50000);
INSERT INTO employees (id, name, department, salary) VALUES (2, 'Jane Smith', 'IT', 60000);
INSERT INTO employees (id, name, department, salary) VALUES (3, 'Bob Johnson', 'HR', 45000);

তাহলে মেথডটি রিটার্ন করবে:

{
    "HR": {
        "employee_count": 2,
        "total_salary": 95000.0
    },
    "IT": {
        "employee_count": 1,
        "total_salary": 60000.0
    }
}

ResultSetExtractor বনাম RowMapper

প্যারামিটারResultSetExtractorRowMapper
ব্যবহার ক্ষেত্রএকাধিক রেকর্ড থেকে জটিল প্রসেসিং প্রয়োজন।প্রতিটি রেকর্ডকে একটি অবজেক্টে ম্যাপ করা।
রিটার্ন টাইপকাস্টম ডাটা টাইপ রিটার্ন করে।একটি লিস্ট বা একক অবজেক্ট রিটার্ন করে।
লজিকের জটিলতাজটিল ডাটা প্রসেসিং সহজ।সাধারণ ডাটা ম্যাপিং-এর জন্য আদর্শ।

উপসংহার

Spring JDBC-তে ResultSetExtractor এমন পরিস্থিতিতে ব্যবহার করা হয় যেখানে একাধিক রেকর্ড বা জটিল ডাটা প্রসেসিং প্রয়োজন। এটি ডাটাবেস থেকে রিট্রাইভ করা ডাটার উপর সম্পূর্ণ কাস্টম প্রক্রিয়াকরণ করার স্বাধীনতা প্রদান করে। সহজ ডাটা ম্যাপিং-এর জন্য RowMapper যথেষ্ট হলেও, জটিল ডাটা লজিক ইমপ্লিমেন্ট করার জন্য ResultSetExtractor একটি শক্তিশালী টুল।

Content added By
টপ রেটেড অ্যাপ

স্যাট অ্যাকাডেমী অ্যাপ

আমাদের অল-ইন-ওয়ান মোবাইল অ্যাপের মাধ্যমে সীমাহীন শেখার সুযোগ উপভোগ করুন।

ভিডিও
লাইভ ক্লাস
এক্সাম
ডাউনলোড করুন
Promotion